package worker;

import java.io.Serializable;
import java.util.ArrayList;

import org.objectweb.proactive.ActiveObjectCreationException;
import org.objectweb.proactive.Body;
import org.objectweb.proactive.api.PAActiveObject;
import org.objectweb.proactive.core.node.NodeException;


public class Master extends MaillonManager implements Serializable {

	private static final long serialVersionUID = 2089240490886433214L;


	public Master () { super (); }
	public Master (ArrayList<Maillon> list) { super(list); }
	public Master (int nbBackup) { super(nbBackup); }
	public Master (ArrayList<Maillon> list, int nbBackup) { super(list, nbBackup); }

	public ArrayList<Maillon> getList() { return maillons; }
	public void setList(ArrayList<Maillon> list) { this.maillons = list; }
	public Body getBody () { return PAActiveObject.getBodyOnThis(); }




	public int add (ManagerImpl manager) throws ActiveObjectCreationException, NodeException {
		
		// Insertion dans la liste maintenue triée par ordre décroissant de taille (tri par dichotomie)
		int min = 0;
		int mid = 0;
		int max = maillons.size();

		while (min < max) {
			mid = (max + min) / 2;
			if(maillons.get(mid).getManager().getHeapSize() < manager.getHeapSize() ) {
				max = mid;
			}else{
				min = mid + 1;
			}
		}
		
		//maillons.add(PAActiveObject.newActive(Maillon.class, new Object[] { manager }));
		this.maillons.add(new Maillon (manager)); // le maillon n'est pas actif
		
		return mid;
	}


	/**
	 * Alloue une liste des workers qui sont libres.
	 */
	public ArrayList<Worker> getWorkers () {
		ArrayList<Worker> allocate = new ArrayList<Worker>();
		for (int i = 0 ; i < maillons.size() ; ++i)
			if (maillons.get(i).isFree()) {
				allocate.add(maillons.get(i).getManager().getWorker());
				maillons.get(i).setFree(false);
			}

		return allocate;
	}
	
	
	/**
	 * Cherche un worker et le rend libre (true).
	 */
	public void freeWorker(Worker m) {
		int index = searchWorker(m);
		if (index != -1) maillons.get(index).setFree(true);
	}
	
	/**
	 * Cherche une liste de worker et les rend libres (true).
	 * @param list
	 */
	public void freeWorkers (ArrayList<Worker> list) {
		for (Worker w : list) freeWorker (w);		
	}

}
